deno lintのJavaScriptプラグインサポートについて
はじめに
設定
code:deno.json
{
"lint": {
}
}
ローカルファイルへのパスに加え、jsrやnpmで公開されたパッケージをプラグインとして利用することもできるようです プラグインの記述について
プラグイン
Deno.lint.Pluginインターフェースを実装したオブジェクトをdefault exportします
code:mod.ts
const plugin: Deno.lint.Plugin = {
name: "deno-lint-plugin-extra-rules",
rules: {
// ルールの一覧...
},
};
export default plugin;
ルールの記述
Deno.lint.Ruleという型で定義されており、以下のようにcreateメソッドを定義する必要があります
code:mod.ts
const plugin: Deno.lint.Plugin = {
name: "deno-lint-plugin-extra-rules",
rules: {
// ...
"prefer-node-assert-strict": {
create: (ctx) => {
const visitor = {
node: Deno.lint.ImportDeclaration,
) => {
ctx.report({
node,
message:
"node:assert/strict should be used instead of node:assert.",
fix: (fixer) => {
return fixer.replaceText(node.source, "node:assert/strict");
},
});
},
};
return visitor;
}
}
},
};
createメソッドの引数にはDeno.lint.RuleContextオブジェクトが渡され、これを介してエラーの報告などの様々な処理を行うことができます
createメソッドはDeno.lint.LintVisitorオブジェクトを返却する必要があります。このオブジェクトには関心のあるノード(Deno.lint.Node)の種別を指定するセレクタをキー、そのノードを処理するための関数を値として指定します
code:plugin.ts
const visitor = {
node: Deno.lint.ImportDeclaration,
) => {
ctx.report({
node,
message:
"node:assert/strict should be used instead of node:assert.",
fix: (fixer) => {
return fixer.replaceText(node.source, "node:assert/strict");
},
});
},
};
return visitor;
上記のようにCSSセレクターライクな構文によって柔軟にノードの指定が可能です エラーを報告したい場合は、Deno.lint.RuleContext#reportにDeno.lint.ReportDataオブジェクトを渡す必要があります (最低限、messageプロパティーの指定が必須です)
テストについて
Deno.lint.runPluginというAPIが提供されており、引数としてDeno.lint.Plugin、ファイル名、Lint対象のソースコードの3つを受け取り、Promise<Array<Deno.lint.Diagnostic>>を返却してくれるため、テストにおいて便利です
コミュニティプラグイン
その他
変更
Deno[Deno.internal].runLintPluginという内部APIが追加
プラグインシステムが正式に導入